package team.niit.dao;

import team.niit.entity.CourseEntity;
import team.niit.entity.StudentEntity;

import java.util.List;

/**
 * @Author: HAPPY
 * @Project_name: JSF
 * @Package_name: team.niit.dao
 * @Date: 2021/10/26 20:08
 * Explain: 命名越靠近数据库就越接近专业术语
 */
public interface CourseDAO {
    /**
     * 添加课程
     * @param courseEntity 要添加的课程实体
     * @return 成功与否
     */
    boolean insertCourse(CourseEntity courseEntity);

    /**
     * 修改课程
     * @param courseEntity 要修改的课程实体
     * @return 成功与否
     */
    boolean updateCourse(CourseEntity courseEntity);

    /**
     * 删除课程
     * @param id 课程编号
     * @return 成功与否
     */
    boolean deleteCourseById(String id);

    /**
     * 查询所有可选课程
     * @return 返回查询结果集
     */
    List<CourseEntity> selectOptionalCoursesList();

    /**
     * 分页查询,推荐使用前端js进行分页操作
     * @param size 每页数量
     * @param pageNumber 第几页
     * @return 返回该页所有数据
     */
    @Deprecated
    List<CourseEntity> pagingQuery(int size, int pageNumber);

    /**
     * 查询课程数据条数
     * @return 返回课程数据条数
     */
    int count();

    /**
     * 查询当前学生是否已选择该课程
     * @param courseId 课程编号
     * @param studentId 学生编号
     * @return 返回是否存在该条记录
     */
    boolean isExist(String courseId, String studentId);

    /**
     * 学生选课
     * @param courseId 课程id
     * @param studentId 学号
     * @return 成功与否
     */
    boolean selectCourse(String courseId, String studentId);

    /**
     * 学生退课
     * @param courseId  课程id
     * @param studentId 学号
     * @return 成功与否
     */
    boolean dropCourse(String courseId, String studentId);

    /**
     * 查询所有课程，查看课表
     * @param id 学号
     * @return 返回课程集合
     */
    CourseEntity[][] selectAllCourse(String id);

    /**
     * 查询所有选择的课程
     * @param id 学号
     * @return 返回课程集合
     */
    List<CourseEntity> selectSelectedCourse(String id);

    /**
     * 统计当前学生选课数量
     * @param studentId 学生编号
     * @return 返回数量
     */
    int countCourse(String studentId);

    /**
     * 该学生课表当前位置是否存在已选课程
     * @return
     */
    boolean isNull(String courseId, String studentId);


    /**
     * 修改学生选课信息
     * @param oldCourseId 旧课程编号
     * @param newCourseId 新课程编号
     * @param studentId 学生编号
     * @return 修改后的学生实体
     */
    StudentEntity insertSelectedCourse(String oldCourseId, String newCourseId, String studentId);

    boolean checkQuota(String courseId);

     /*
     管理员查询课程
        */

    CourseEntity selectById(String id);

    /*
    管理员查询学生已经选择的课程
     */

    List<CourseEntity> queryStudentCourse(String studentId);

    /*
    管理员为学生选课
     */
    boolean insertStudentCourse(String studentId, String courseId);

    /*管理员删除学生选择的课

     */
    boolean deleteStudentCourse(String studentId, String courseId);

    List<CourseEntity> selectAll();
}
